New functions to rotate pixbufs by multiples of 90 degrees and to flip
authorMatthias Clasen <maclas@gmx.de>
Mon, 21 Jun 2004 04:52:24 +0000 (04:52 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 21 Jun 2004 04:52:24 +0000 (04:52 +0000)
Mon Jun 21 00:44:51 2004  Matthias Clasen  <maclas@gmx.de>

* gdk-pixbuf-transform.h:
* gdk-pixbuf-scale.c (gdk_pixbuf_rotate_simple):
* gdk-pixbuf-scale.c (gdk_pixbuf_flip): New functions to
rotate pixbufs by multiples of 90 degrees and to flip them
horizontally or vertically.

gdk-pixbuf/ChangeLog
gdk-pixbuf/gdk-pixbuf-scale.c
gdk-pixbuf/gdk-pixbuf-transform.h

index 81497c59d50bd40b3556ab9a4c505e6fb679cff8..64a6f7764fbc87c0180d2a1b2fcfaabc726239a6 100644 (file)
@@ -1,3 +1,11 @@
+Mon Jun 21 00:44:51 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gdk-pixbuf-transform.h: 
+       * gdk-pixbuf-scale.c (gdk_pixbuf_rotate_simple): 
+       * gdk-pixbuf-scale.c (gdk_pixbuf_flip): New functions to
+       rotate pixbufs by multiples of 90 degrees and to flip them
+       horizontally or vertically.
+
 Sun Jun 20 01:06:48 2004  Matthias Clasen  <maclas@gmx.de>
 
        Header reorganization.  (#51999, Jeff Franks, reorganization
index cc89946255eabece7080f684c8ee00c1cebb73c8..b81aeb1a68e445b0c364cb2fd70453830b7c23b4 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <config.h>
 #include <math.h>
+#include <string.h>
 #include "gdk-pixbuf-private.h"
 #include "pixops/pixops.h"
 
@@ -305,3 +306,150 @@ gdk_pixbuf_composite_color_simple (const GdkPixbuf *src,
 
   return dest;
 }
+
+#define OFFSET(pb, x, y) ((x) * (pb)->n_channels + (y) * (pb)->rowstride)
+
+/**
+ * gdk_pixbuf_rotate_simple:
+ * @src: a #GdkPixbuf
+ * @angle: the angle to rotate by
+ *
+ * Rotates a pixbuf by a multiple of 90 degrees, and returns the
+ * result in a new pixbuf.
+ *
+ * Returns: a new pixbuf
+ *
+ * Since: 2.6
+ */
+GdkPixbuf *
+gdk_pixbuf_rotate_simple (const GdkPixbuf   *src,
+                         GdkPixbufRotation  angle)
+{
+  GdkPixbuf *dest;
+  guchar *p, *q;
+  gint x, y;
+
+  switch (angle % 360)
+    {
+    case 0:
+      dest = gdk_pixbuf_copy (src);
+      break;
+    case 90:
+      dest = gdk_pixbuf_new (src->colorspace, 
+                            src->has_alpha, 
+                            src->bits_per_sample, 
+                            src->height, 
+                            src->width);
+      if (!dest)
+       return NULL;
+
+      for (y = 0; y < src->height; y++) 
+       { 
+         for (x = 0; x < src->width; x++) 
+           { 
+             p = src->pixels + OFFSET (src, x, y); 
+             q = dest->pixels + OFFSET (dest, y, src->width - x - 1); 
+             memcpy (q, p, dest->n_channels);
+           }
+       } 
+      break;
+    case 180:
+      dest = gdk_pixbuf_new (src->colorspace, 
+                            src->has_alpha, 
+                            src->bits_per_sample, 
+                            src->width, 
+                            src->height);
+      if (!dest)
+       return NULL;
+
+      for (y = 0; y < src->height; y++) 
+       { 
+         for (x = 0; x < src->width; x++) 
+           { 
+             p = src->pixels + OFFSET (src, x, y); 
+             q = dest->pixels + OFFSET (dest, src->width - x - 1, src->height - y - 1); 
+             memcpy (q, p, dest->n_channels);
+           }
+       } 
+      break;
+    case 270:
+      dest = gdk_pixbuf_new (src->colorspace, 
+                            src->has_alpha, 
+                            src->bits_per_sample, 
+                            src->height, 
+                            src->width);
+      if (!dest)
+       return NULL;
+
+      for (y = 0; y < src->height; y++) 
+       { 
+         for (x = 0; x < src->width; x++) 
+           { 
+             p = src->pixels + OFFSET (src, x, y); 
+             q = dest->pixels + OFFSET (dest, src->height - y - 1, x); 
+             memcpy (q, p, dest->n_channels);
+           }
+       } 
+      break;
+    default:
+      g_warning ("gdk_pixbuf_rotate_simple() can only rotate "
+                "by multiples of 90 degrees");
+      g_assert_not_reached ();
+  } 
+
+  return dest;
+}
+
+/**
+ * gdk_pixbuf_flip:
+ * @src: a #GdkPixbuf
+ * @horizontal: %TRUE to flip horizontally, %FALSE to flip vertically
+ *
+ * Flips a pixbuf horizontally or vertically and returns the
+ * result in a new pixbuf.
+ *
+ * Returns: a new pixbuf.
+ *
+ * Since: 2.6
+ */
+GdkPixbuf *
+gdk_pixbuf_flip (const GdkPixbuf *src,
+                gboolean         horizontal)
+{
+  GdkPixbuf *dest;
+  guchar *p, *q;
+  gint x, y;
+
+  dest = gdk_pixbuf_new (src->colorspace, 
+                        src->has_alpha, 
+                        src->bits_per_sample, 
+                        src->width, 
+                        src->height);
+  if (!dest)
+    return NULL;
+
+  if (!horizontal) /* flip vertical */
+    {
+      for (y = 0; y < dest->height; y++)
+       {
+         p = src->pixels + OFFSET (src, 0, y);
+         q = dest->pixels + OFFSET (dest, 0, dest->height - y - 1);
+         memcpy (q, p, dest->rowstride);
+       }
+    }
+  else /* flip horizontal */
+    {
+      for (y = 0; y < dest->height; y++)
+       {
+         for (x = 0; x < dest->width; x++)
+           {
+             p = src->pixels + OFFSET (src, x, y);
+             q = dest->pixels + OFFSET (dest, dest->width - x - 1, y);
+             memcpy (q, p, dest->n_channels);
+           }
+       }
+    }
+
+  return dest;
+}
+                                    
index b6c25c9cb26ed5118c0523ea17ad420a70aa944c..6a1bb1e5239c6b0a8c4e5e46c77539fd29ca017e 100644 (file)
@@ -42,6 +42,13 @@ typedef enum {
        GDK_INTERP_HYPER
 } GdkInterpType;
 
+typedef enum {
+       GDK_PIXBUF_ROTATE_NONE             =   0,
+       GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE =  90,
+       GDK_PIXBUF_ROTATE_UPSIDEDOWN       = 180,
+       GDK_PIXBUF_ROTATE_CLOCKWISE        = 270
+} GdkPixbufRotation;
+
 void gdk_pixbuf_scale           (const GdkPixbuf *src,
                                 GdkPixbuf       *dest,
                                 int              dest_x,
@@ -97,7 +104,11 @@ GdkPixbuf *gdk_pixbuf_composite_color_simple (const GdkPixbuf *src,
                                              guint32          color1,
                                              guint32          color2);
 
-
+GdkPixbuf *gdk_pixbuf_rotate_simple          (const GdkPixbuf   *src,
+                                             GdkPixbufRotation  angle);
+GdkPixbuf *gdk_pixbuf_flip                   (const GdkPixbuf   *src,
+                                             gboolean           horizontal);
+                                    
 G_END_DECLS